package com.blue.base.common.bean.tree;

import com.google.common.collect.Lists;

import java.util.List;

/**
 * 树节点工具
 *
 * @author liulei
 * @version 1.0
 */
public class TreeUtil<T extends TreeNode> {


    private TreeUtil() {

    }

    public static TreeUtil getTreeBuilder() {
        return new TreeUtil();
    }

    /**
     * 递归追加子节点
     *
     * @param node       节点
     * @param parentNode 父节点
     * @return tree
     */
    private void recurseAppendTreeNode(TreeNode node, List<TreeNode> parentNode, boolean isId) {
        // 递归每一个节点，来找到父节点，且一定可以找到一个父节点
        for (TreeNode parent : parentNode) {
            List<TreeNode> children = parent.getChildren();
            if (null == children) {
                children = Lists.newArrayList();
            }

            if ((isId && parent.getId().equals(node.getPId())) || (!isId && parent.getCode().equals(node.getPcode()))) {
                node.setPId(parent.getId());
                children.add(node);
                parent.setChildren(children);
            } else {
                recurseAppendTreeNode(node, children, isId);
            }
        }
    }

    /**
     * 以根节点开始，对集合的数据树化[按照某个维度来判断子节点是否父节点]
     * data的集合，必须要有初始的排序，否则无法添加子节点
     *
     * @param data     原始数据
     * @param rootNode 根节点
     * @param isId     是否按照ID判断父子关系
     */
    public List listTreeFy(List<T> data, TreeNode rootNode, boolean isId) {
        List<TreeNode> result = Lists.newArrayList();
        result.add(rootNode);
        for (T node : data) {
            recurseAppendTreeNode(node, result, isId);
        }
        return result;
    }

}
